home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc Development Framework / ODFDev / ODF / Framewrk / FWPart / Sources / FWIters.cpp < prev    next >
Encoding:
Text File  |  1996-04-25  |  22.3 KB  |  675 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWIters.cpp
  4. //    Release Version:    $ ODF 1 $
  5. //
  6. //    Copyright:            (c) 1995 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "FWFrameW.hpp"
  11.  
  12. #ifndef FWITERS_H
  13. #include "FWIters.h"
  14. #endif
  15.  
  16. #ifndef FWFRAME_H
  17. #include "FWFrame.h"
  18. #endif
  19.  
  20. #ifndef FWFRMING_H
  21. #include "FWFrming.h"
  22. #endif
  23.  
  24. #ifndef FWPROXY_H
  25. #include "FWProxy.h"
  26. #endif
  27.  
  28. #ifndef FWPXYFRM_H
  29. #include "FWPxyFrm.h"
  30. #endif
  31.  
  32. #ifndef FWPRESEN_H
  33. #include "FWPresen.h"
  34. #endif
  35.  
  36. // ----- OpenDoc includes
  37.  
  38. #ifndef SOM_ODFacet_xh
  39. #include <Facet.xh>
  40. #endif
  41.  
  42. #ifndef SOM_ODFocusSet_xh
  43. #include <FocusSet.xh>
  44. #endif
  45.  
  46. #if defined(__MWERKS__) && GENERATING68K
  47. // A hack to work around a bug
  48. #pragma import list somGetGlobalEnvironment
  49. #endif
  50.  
  51. //========================================================================================
  52. //    Runtime information
  53. //========================================================================================
  54.  
  55. #ifdef FW_BUILD_MAC
  56. #pragma segment framework
  57. #endif
  58.  
  59. FW_DEFINE_AUTO(FW_CPresentationFrameIterator)
  60. FW_DEFINE_AUTO(FW_CFrameFacetIterator)
  61. FW_DEFINE_AUTO(FW_CODFrameFacetIterator)
  62. FW_DEFINE_AUTO(FW_CFacetIterator)
  63. FW_DEFINE_AUTO(FW_CPresentationFacetIterator)
  64. FW_DEFINE_AUTO(FW_CFrameEmbeddedFrameIterator)
  65. FW_DEFINE_AUTO(FW_CEmbeddedODFacetsIterator)
  66. FW_DEFINE_AUTO(FW_CFrameProxyFrameIterator)
  67. FW_DEFINE_AUTO(FW_CFocusSetIterator)
  68.  
  69.  
  70. //========================================================================================
  71. //    class FW_CPresentationFrameIterator
  72. //========================================================================================
  73.  
  74. //----------------------------------------------------------------------------------------
  75. //    FW_CPresentationFrameIterator::FW_CPresentationFrameIterator
  76. //----------------------------------------------------------------------------------------
  77.  
  78. FW_CPresentationFrameIterator::FW_CPresentationFrameIterator(Environment* ev, FW_CPresentation* presentation) :
  79.     fIterator(presentation->fFrames),
  80.     fCurrentFrame(NULL),
  81.     fFrameGroup(0),
  82.     fSequenceNumber(0)
  83. {
  84. FW_UNUSED(ev);
  85.     FW_END_CONSTRUCTOR
  86. }
  87.  
  88. //----------------------------------------------------------------------------------------
  89. //    FW_CPresentationFrameIterator::FW_CPresentationFrameIterator
  90. //----------------------------------------------------------------------------------------
  91.  
  92. FW_CPresentationFrameIterator::FW_CPresentationFrameIterator(Environment* ev, FW_CPresentation* presentation, ODID frameGroup, ODID sequenceNumber) :
  93.     fIterator(presentation->fFrames),
  94.     fCurrentFrame(NULL),
  95.     fFrameGroup(frameGroup),
  96.     fSequenceNumber(sequenceNumber)
  97. {
  98. FW_UNUSED(ev);
  99.     FW_ASSERT((frameGroup==0 && sequenceNumber==0) || (frameGroup!=0 && sequenceNumber!=0));
  100.  
  101.     FW_END_CONSTRUCTOR
  102. }
  103.  
  104. //----------------------------------------------------------------------------------------
  105. //    FW_CPresentationFrameIterator::~FW_CPresentationFrameIterator
  106. //----------------------------------------------------------------------------------------
  107.  
  108. FW_CPresentationFrameIterator::~FW_CPresentationFrameIterator()
  109. {
  110.     FW_START_DESTRUCTOR
  111. }
  112.  
  113. //----------------------------------------------------------------------------------------
  114. //    FW_CPresentationFrameIterator::First
  115. //----------------------------------------------------------------------------------------
  116.  
  117. FW_CFrame* FW_CPresentationFrameIterator::First(Environment* ev)
  118. {
  119.     return GetNext(ev, fIterator.First());
  120. }
  121.  
  122. //----------------------------------------------------------------------------------------
  123. //    FW_CPresentationFrameIterator::Next
  124. //----------------------------------------------------------------------------------------
  125.  
  126. FW_CFrame* FW_CPresentationFrameIterator::Next(Environment* ev)
  127. {
  128.     return GetNext(ev, fIterator.Next());
  129. }
  130.  
  131. //----------------------------------------------------------------------------------------
  132. //    FW_CPresentationFrameIterator::Last
  133. //----------------------------------------------------------------------------------------
  134.  
  135. FW_CFrame* FW_CPresentationFrameIterator::Last(Environment* ev)
  136. {
  137.     return GetPrevious(ev, fIterator.Last());
  138. }
  139.  
  140. //----------------------------------------------------------------------------------------
  141. //    FW_CPresentationFrameIterator::Previous
  142. //----------------------------------------------------------------------------------------
  143.  
  144. FW_CFrame* FW_CPresentationFrameIterator::Previous(Environment* ev)
  145. {
  146.     return GetPrevious(ev, fIterator.Previous());
  147. }
  148.  
  149. //----------------------------------------------------------------------------------------
  150. //    FW_CPresentationFrameIterator::GetNext
  151. //----------------------------------------------------------------------------------------
  152.  
  153. FW_CFrame* FW_CPresentationFrameIterator::GetNext(Environment* ev, FW_CPrivDisplayFrame* displayFrame)
  154. {
  155.     FW_Boolean useGroup = (fFrameGroup != 0) && (fSequenceNumber != 0);
  156.     fCurrentFrame = NULL;
  157.     while (displayFrame != NULL)
  158.     {
  159.         FW_CFrame* theFrame = displayFrame->fFrame;
  160.         if (theFrame != NULL)
  161.         {
  162.             if ((!useGroup) || ((theFrame->GetFrameGroup(ev) == fFrameGroup) && (theFrame->GetSequenceNumber(ev) == fSequenceNumber)))
  163.             {
  164.                 fCurrentFrame = theFrame;
  165.                 break;
  166.             }
  167.         }
  168.         
  169.         displayFrame = fIterator.Next();
  170.     }
  171.     
  172.     return fCurrentFrame;
  173. }
  174.  
  175. //----------------------------------------------------------------------------------------
  176. //    FW_CPresentationFrameIterator::GetPrevious
  177. //----------------------------------------------------------------------------------------
  178.  
  179. FW_CFrame* FW_CPresentationFrameIterator::GetPrevious(Environment* ev, FW_CPrivDisplayFrame* displayFrame)
  180. {
  181.     FW_Boolean useGroup = (fFrameGroup != 0) && (fSequenceNumber != 0);
  182.     fCurrentFrame = NULL;
  183.     while (displayFrame != NULL)
  184.     {
  185.         FW_CFrame* theFrame = displayFrame->fFrame;
  186.         if (theFrame != NULL)
  187.         {
  188.             if ((!useGroup) || ((theFrame->GetFrameGroup(ev) == fFrameGroup) && (theFrame->GetSequenceNumber(ev) == fSequenceNumber)))
  189.             {
  190.                 fCurrentFrame = theFrame;
  191.                 break;
  192.             }
  193.         }
  194.         
  195.         displayFrame = fIterator.Previous();
  196.     }
  197.     
  198.     return fCurrentFrame;
  199. }
  200.  
  201. //========================================================================================
  202. //    class FW_CFrameFacetIterator
  203. //========================================================================================
  204.  
  205. //----------------------------------------------------------------------------------------
  206. //    FW_CFrameFacetIterator::FW_CFrameFacetIterator
  207. //----------------------------------------------------------------------------------------
  208.  
  209. FW_CFrameFacetIterator::FW_CFrameFacetIterator(Environment* ev, const FW_CFrame* frame):
  210.     FW_CODFrameFacetIterator(ev, frame->GetODFrame(ev))
  211. {
  212.     FW_END_CONSTRUCTOR
  213. }
  214.  
  215. //----------------------------------------------------------------------------------------
  216. //    FW_CFrameFacetIterator::~FW_CFrameFacetIterator
  217. //----------------------------------------------------------------------------------------
  218.  
  219. FW_CFrameFacetIterator::~FW_CFrameFacetIterator()
  220. {
  221.     FW_START_DESTRUCTOR
  222. }
  223.  
  224. //========================================================================================
  225. //    class FW_CODFrameFacetIterator
  226. //========================================================================================
  227.  
  228. //----------------------------------------------------------------------------------------
  229. //    FW_CODFrameFacetIterator::FW_CODFrameFacetIterator
  230. //----------------------------------------------------------------------------------------
  231.  
  232. FW_CODFrameFacetIterator::FW_CODFrameFacetIterator(Environment* ev, ODFrame* odFrame):
  233.     fODFrameFacetIte(NULL)
  234. {
  235.     fODFrameFacetIte = odFrame->CreateFacetIterator(ev);
  236.     
  237.     FW_END_CONSTRUCTOR
  238. }
  239.  
  240. //----------------------------------------------------------------------------------------
  241. //    FW_CODFrameFacetIterator::~FW_CODFrameFacetIterator
  242. //----------------------------------------------------------------------------------------
  243.  
  244. FW_CODFrameFacetIterator::~FW_CODFrameFacetIterator()
  245. {
  246.     FW_START_DESTRUCTOR
  247.     
  248.     delete fODFrameFacetIte;
  249. }
  250.  
  251. //========================================================================================
  252. //    FW_CFacetIterator
  253. //========================================================================================
  254.  
  255. //----------------------------------------------------------------------------------------
  256. //    FW_CFacetIterator::FW_CFacetIterator
  257. //----------------------------------------------------------------------------------------
  258.  
  259. FW_CFacetIterator::FW_CFacetIterator(Environment* ev, 
  260.                                     ODFacet* facet,
  261.                                     ODTraversalType traversalType,
  262.                                     ODSiblingOrder siblingOrder) :
  263.     fODFacetIterator(NULL)
  264. {
  265.     fODFacetIterator = facet->CreateFacetIterator(ev, traversalType, siblingOrder);
  266.  
  267.     FW_END_CONSTRUCTOR
  268. }
  269.  
  270. //----------------------------------------------------------------------------------------
  271. //    FW_CFacetIterator::~FW_CFacetIterator
  272. //----------------------------------------------------------------------------------------
  273.  
  274. FW_CFacetIterator::~FW_CFacetIterator()
  275. {
  276.     FW_START_DESTRUCTOR
  277.     
  278.     delete fODFacetIterator;
  279.     fODFacetIterator = NULL;
  280. }
  281.  
  282. //========================================================================================
  283. //    FW_CPresentationFacetIterator
  284. //========================================================================================
  285.  
  286. //----------------------------------------------------------------------------------------
  287. //    FW_CPresentationFacetIterator::FW_CPresentationFacetIterator
  288. //----------------------------------------------------------------------------------------
  289.  
  290. FW_CPresentationFacetIterator::FW_CPresentationFacetIterator(Environment* ev, FW_CPresentation* presentation):
  291.     fFacetIterator(NULL),
  292.     fCurrentFacet(NULL),
  293.     fFrameIterator(ev, presentation)
  294. {
  295.     FW_END_CONSTRUCTOR
  296. }
  297.  
  298. //----------------------------------------------------------------------------------------
  299. //    FW_CPresentationFacetIterator::~FW_CPresentationFacetIterator
  300. //----------------------------------------------------------------------------------------
  301.  
  302. FW_CPresentationFacetIterator::~FW_CPresentationFacetIterator()
  303. {
  304.     FW_START_DESTRUCTOR
  305.     
  306.     delete fFacetIterator;
  307. }
  308.  
  309. //----------------------------------------------------------------------------------------
  310. //    FW_CPresentationFacetIterator::First
  311. //----------------------------------------------------------------------------------------
  312.  
  313. ODFacet* FW_CPresentationFacetIterator::First(Environment* ev)
  314. {
  315.     FW_CFrame* frame = fFrameIterator.First(ev);
  316.     fCurrentFacet = ResetFacetIterator(ev, frame);
  317.     
  318.     return fCurrentFacet;
  319. }
  320.  
  321. //----------------------------------------------------------------------------------------
  322. //    FW_CPresentationFacetIterator::Next
  323. //----------------------------------------------------------------------------------------
  324.  
  325. ODFacet* FW_CPresentationFacetIterator::Next(Environment* ev)
  326. {
  327.     fCurrentFacet = NULL;
  328.     
  329.     if (fFacetIterator)
  330.     {
  331.         fCurrentFacet = fFacetIterator->Next(ev);
  332.         if (fCurrentFacet == NULL)
  333.         {
  334.             delete fFacetIterator;
  335.             fFacetIterator = NULL;
  336.             
  337.             fCurrentFacet = ResetFacetIterator(ev, fFrameIterator.Next(ev));
  338.         }
  339.     }
  340.     
  341.     return fCurrentFacet;
  342. }
  343.  
  344. //----------------------------------------------------------------------------------------
  345. //    FW_CPresentationFacetIterator::ResetFacetIterator
  346. //----------------------------------------------------------------------------------------
  347.  
  348. ODFacet* FW_CPresentationFacetIterator::ResetFacetIterator(Environment* ev, FW_CFrame* frame)
  349. {
  350.     if (frame != NULL)
  351.     {
  352.         fFacetIterator = FW_NEW(FW_CFrameFacetIterator, (ev, frame));
  353.         return fFacetIterator->First(ev);
  354.     }
  355.     
  356.     return NULL;
  357. }
  358.  
  359. //========================================================================================
  360. //    FW_CFrameEmbeddedFrameIterator
  361. //========================================================================================
  362.  
  363. //----------------------------------------------------------------------------------------
  364. //    FW_CFrameEmbeddedFrameIterator::FW_CFrameEmbeddedFrameIterator
  365. //----------------------------------------------------------------------------------------
  366.  
  367. FW_CFrameEmbeddedFrameIterator::FW_CFrameEmbeddedFrameIterator(Environment* ev, const FW_CEmbeddingFrame* frame) :
  368.     fIterator(ev, frame),
  369.     fCurrentFrame(NULL)
  370. {
  371.     FW_END_CONSTRUCTOR
  372. }
  373.  
  374. //----------------------------------------------------------------------------------------
  375. //    FW_CFrameEmbeddedFrameIterator::~FW_CFrameEmbeddedFrameIterator
  376. //----------------------------------------------------------------------------------------
  377.  
  378. FW_CFrameEmbeddedFrameIterator::~FW_CFrameEmbeddedFrameIterator()
  379. {
  380.     FW_START_DESTRUCTOR
  381. }
  382.  
  383. //----------------------------------------------------------------------------------------
  384. //    FW_CFrameEmbeddedFrameIterator::First
  385. //----------------------------------------------------------------------------------------
  386.  
  387. ODFrame* FW_CFrameEmbeddedFrameIterator::First(Environment* ev)
  388. {
  389.     return PrivNext(ev, fIterator.First(ev));
  390. }
  391.  
  392. //----------------------------------------------------------------------------------------
  393. //    FW_CFrameEmbeddedFrameIterator::Next
  394. //----------------------------------------------------------------------------------------
  395.  
  396. ODFrame* FW_CFrameEmbeddedFrameIterator::Next(Environment* ev)
  397. {
  398.     return PrivNext(ev, fIterator.Next(ev));
  399. }
  400.  
  401. //----------------------------------------------------------------------------------------
  402. //    FW_CFrameEmbeddedFrameIterator::Last
  403. //----------------------------------------------------------------------------------------
  404.  
  405. ODFrame* FW_CFrameEmbeddedFrameIterator::Last(Environment* ev)
  406. {
  407.     return PrivPrevious(ev, fIterator.Last(ev));
  408. }
  409.  
  410. //----------------------------------------------------------------------------------------
  411. //    FW_CFrameEmbeddedFrameIterator::Previous
  412. //----------------------------------------------------------------------------------------
  413.  
  414. ODFrame* FW_CFrameEmbeddedFrameIterator::Previous(Environment* ev)
  415. {
  416.     return PrivPrevious(ev, fIterator.Previous(ev));
  417. }
  418.  
  419. //----------------------------------------------------------------------------------------
  420. //    FW_CFrameEmbeddedFrameIterator::PrivNext
  421. //----------------------------------------------------------------------------------------
  422.  
  423. ODFrame* FW_CFrameEmbeddedFrameIterator::PrivNext(Environment* ev, FW_CProxyFrame* proxyFrame)
  424. {
  425.     fCurrentFrame = NULL;
  426.     while (proxyFrame != NULL)
  427.     {
  428.         if (proxyFrame->IsFrameInMemory(ev))
  429.         {
  430.             fCurrentFrame = proxyFrame->GetFrame(ev);
  431.             break;
  432.         }
  433.         
  434.         proxyFrame = fIterator.Next(ev);
  435.     }
  436.     
  437.     return fCurrentFrame;
  438. }
  439.  
  440. //----------------------------------------------------------------------------------------
  441. //    FW_CFrameEmbeddedFrameIterator::PrivPrevious
  442. //----------------------------------------------------------------------------------------
  443.  
  444. ODFrame* FW_CFrameEmbeddedFrameIterator::PrivPrevious(Environment* ev, FW_CProxyFrame* proxyFrame)
  445. {
  446.     fCurrentFrame = NULL;
  447.     while (proxyFrame != NULL)
  448.     {
  449.         if (proxyFrame->IsFrameInMemory(ev))
  450.         {
  451.             fCurrentFrame = proxyFrame->GetFrame(ev);
  452.             break;
  453.         }
  454.         
  455.         proxyFrame = fIterator.Previous(ev);
  456.     }
  457.     
  458.     return fCurrentFrame;
  459. }
  460.  
  461. //========================================================================================
  462. //    FW_CEmbeddedODFacetsIterator
  463. //========================================================================================
  464.  
  465. //----------------------------------------------------------------------------------------
  466. //    FW_CEmbeddedODFacetsIterator::FW_CEmbeddedODFacetsIterator
  467. //----------------------------------------------------------------------------------------
  468.  
  469. FW_CEmbeddedODFacetsIterator::FW_CEmbeddedODFacetsIterator(Environment* ev,
  470.                                                             const FW_MProxy* proxy, 
  471.                                                             ODFacet* embeddingFacet, 
  472.                                                             ODSiblingOrder siblingOrder) :
  473.     fODFacetIterator(NULL),
  474.     fODFacet(NULL),
  475.     fEmbeddedODPart(proxy->AcquireEmbeddedPart(ev)),
  476.     fSequenceNumber(proxy->GetSequenceNumber(ev)),
  477.     fFrameGroup(proxy->GetFrameGroup(ev))
  478. {
  479.     FW_ASSERT(fEmbeddedODPart);
  480.     
  481.     fODFacetIterator = embeddingFacet->CreateFacetIterator(ev, kODChildrenOnly, siblingOrder);
  482.     
  483.     FW_END_CONSTRUCTOR
  484. }
  485.  
  486. //----------------------------------------------------------------------------------------
  487. //    FW_CEmbeddedODFacetsIterator::~FW_CEmbeddedODFacetsIterator
  488. //----------------------------------------------------------------------------------------
  489.  
  490. FW_CEmbeddedODFacetsIterator::~FW_CEmbeddedODFacetsIterator()
  491. {
  492.     FW_START_DESTRUCTOR
  493.     
  494.     fEmbeddedODPart->Release(somGetGlobalEnvironment());
  495.     delete fODFacetIterator;
  496. }
  497.  
  498. //----------------------------------------------------------------------------------------
  499. //    FW_CEmbeddedODFacetsIterator::First
  500. //----------------------------------------------------------------------------------------
  501.  
  502. ODFacet* FW_CEmbeddedODFacetsIterator::First(Environment* ev)
  503. {
  504.     return PrivFindNext(ev, fODFacetIterator->First(ev));
  505. }
  506.  
  507. //----------------------------------------------------------------------------------------
  508. //    FW_CEmbeddedODFacetsIterator::Next
  509. //----------------------------------------------------------------------------------------
  510.  
  511. ODFacet* FW_CEmbeddedODFacetsIterator::Next(Environment* ev)
  512. {
  513.     return PrivFindNext(ev, fODFacetIterator->Next(ev));
  514. }
  515.  
  516. //----------------------------------------------------------------------------------------
  517. //    FW_CEmbeddedODFacetsIterator::IsNotComplete
  518. //----------------------------------------------------------------------------------------
  519.  
  520. FW_Boolean FW_CEmbeddedODFacetsIterator::IsNotComplete(Environment* ev)
  521. {
  522. FW_UNUSED(ev);
  523.     return fODFacet != NULL;
  524. }
  525.  
  526. //----------------------------------------------------------------------------------------
  527. //    FW_CEmbeddedODFacetsIterator::PrivFindNext
  528. //----------------------------------------------------------------------------------------
  529.  
  530. ODFacet* FW_CEmbeddedODFacetsIterator::PrivFindNext(Environment* ev, ODFacet* facet)
  531. {
  532.     FW_Boolean useGroup = (fFrameGroup != 0) && (fSequenceNumber != 0);
  533.  
  534.     fODFacet = facet;    
  535.     while (fODFacet != NULL)
  536.     {
  537.         ODFrame* embeddedFrame = fODFacet->GetFrame(ev);
  538.         FW_CAcquiredODPart aqODPart = embeddedFrame->AcquirePart(ev);
  539.         if (aqODPart == fEmbeddedODPart && 
  540.             ((!useGroup) || ((embeddedFrame->GetFrameGroup(ev) == fFrameGroup) && (embeddedFrame->GetSequenceNumber(ev) == fSequenceNumber))))
  541.         {
  542.             return fODFacet;
  543.         }
  544.         fODFacet = fODFacetIterator->Next(ev);
  545.     } 
  546.     
  547.     return NULL;
  548. }
  549.  
  550. //========================================================================================
  551. //    class FW_CFrameProxyFrameIterator
  552. //========================================================================================
  553.  
  554. //---------------------------------------------------------------------------------------
  555. //    FW_CFrameProxyFrameIterator::FW_CFrameProxyFrameIterator
  556. //---------------------------------------------------------------------------------------
  557.  
  558. FW_CFrameProxyFrameIterator::FW_CFrameProxyFrameIterator(Environment* ev, const FW_CEmbeddingFrame* frame) :
  559.     fProxyIterator(frame->GetPart(ev)),
  560.     fCurrentFrame(NULL),
  561.     fContainerID(frame->GetID(ev))
  562. {
  563.     FW_END_CONSTRUCTOR
  564. }
  565.  
  566. //---------------------------------------------------------------------------------------
  567. //    FW_CFrameProxyFrameIterator::~FW_CFrameProxyFrameIterator
  568. //---------------------------------------------------------------------------------------
  569.  
  570. FW_CFrameProxyFrameIterator::~FW_CFrameProxyFrameIterator()
  571. {
  572.     FW_START_DESTRUCTOR
  573. }
  574.  
  575. //---------------------------------------------------------------------------------------
  576. //    FW_CFrameProxyFrameIterator::GetNext
  577. //---------------------------------------------------------------------------------------
  578.  
  579. FW_CProxyFrame* FW_CFrameProxyFrameIterator::GetNext(Environment* ev, FW_MProxy* proxy)
  580. {
  581.     while (fProxyIterator.IsNotComplete())
  582.     {
  583.         FW_CProxyFrame* proxyFrame = proxy->PrivContainerIDToProxyFrame(ev, fContainerID);
  584.         if (proxyFrame)
  585.             return proxyFrame;
  586.         proxy = fProxyIterator.Next();
  587.     }
  588.     
  589.     return NULL;
  590. }
  591.  
  592. //---------------------------------------------------------------------------------------
  593. //    FW_CFrameProxyFrameIterator::GetPrevious
  594. //---------------------------------------------------------------------------------------
  595.  
  596. FW_CProxyFrame* FW_CFrameProxyFrameIterator::GetPrevious(Environment* ev, FW_MProxy* proxy)
  597. {
  598.     while (fProxyIterator.IsNotComplete())
  599.     {
  600.         FW_CProxyFrame* proxyFrame = proxy->PrivContainerIDToProxyFrame(ev, fContainerID);
  601.         if (proxyFrame)
  602.             return proxyFrame;
  603.         proxy = fProxyIterator.Previous();
  604.     }
  605.     
  606.     return NULL;
  607. }
  608.  
  609. //---------------------------------------------------------------------------------------
  610. //    FW_CFrameProxyFrameIterator::First
  611. //---------------------------------------------------------------------------------------
  612.  
  613. FW_CProxyFrame* FW_CFrameProxyFrameIterator::First(Environment* ev)
  614. {
  615.     fCurrentFrame = GetNext(ev, fProxyIterator.First());
  616.     return fCurrentFrame;
  617. }
  618.  
  619. //---------------------------------------------------------------------------------------
  620. //    FW_CFrameProxyFrameIterator::Last
  621. //---------------------------------------------------------------------------------------
  622.  
  623. FW_CProxyFrame* FW_CFrameProxyFrameIterator::Last(Environment* ev)
  624. {
  625.     fCurrentFrame = GetPrevious(ev, fProxyIterator.Last());
  626.     return fCurrentFrame;
  627. }
  628.  
  629. //---------------------------------------------------------------------------------------
  630. //    FW_CFrameProxyFrameIterator::Next
  631. //---------------------------------------------------------------------------------------
  632.  
  633. FW_CProxyFrame* FW_CFrameProxyFrameIterator::Next(Environment* ev)
  634. {
  635.     fCurrentFrame = GetNext(ev, fProxyIterator.Next());
  636.     return fCurrentFrame;
  637. }
  638.  
  639. //---------------------------------------------------------------------------------------
  640. //    FW_CFrameProxyFrameIterator::Previous
  641. //---------------------------------------------------------------------------------------
  642.  
  643. FW_CProxyFrame* FW_CFrameProxyFrameIterator::Previous(Environment* ev)
  644. {
  645.     fCurrentFrame = GetPrevious(ev, fProxyIterator.Previous());
  646.     return fCurrentFrame;
  647. }
  648.  
  649. //========================================================================================
  650. //    class FW_CFocusSetIterator
  651. //========================================================================================
  652.  
  653. //----------------------------------------------------------------------------------------
  654. //    FW_CFocusSetIterator::FW_CFocusSetIterator
  655. //----------------------------------------------------------------------------------------
  656.  
  657. FW_CFocusSetIterator::FW_CFocusSetIterator(Environment* ev, const FW_CFrame* frame)
  658. {
  659.     fIterator = frame->GetFocusSet(ev)->CreateIterator(ev);
  660.  
  661.     FW_END_CONSTRUCTOR
  662. }
  663.  
  664. //----------------------------------------------------------------------------------------
  665. //    FW_CFocusSetIterator::~FW_CFocusSetIterator
  666. //----------------------------------------------------------------------------------------
  667.  
  668. FW_CFocusSetIterator::~FW_CFocusSetIterator()
  669. {
  670.     FW_START_DESTRUCTOR
  671.     
  672.     delete fIterator;
  673.     fIterator = NULL;
  674. }
  675.